home *** CD-ROM | disk | FTP | other *** search
Lisp/Scheme | 1988-04-07 | 2.0 KB | 54 lines | [TEXT/ttxt] |
- ;; Larry Mulcahy 1988
- ;; b-tree
-
- (provide 'b-tree)
- (require 'structure "structur")
- (require 'sequence)
- (require 'math)
-
- (defstruct b-tree
- value
- (count 0)
- left
- right)
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; add-to-b-tree
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun add-to-b-tree (value tree
- &key (less-than-predicate #'string<)
- (equal-predicate #'string=))
- (if (b-tree-value tree)
- (if (funcall equal-predicate value (b-tree-value tree))
- (let ((result (copy-b-tree tree))) ; increase count
- (incf (b-tree-count result)) ; of value already
- result) ; in the tree
- (let ((result (copy-b-tree tree)))
- (if (funcall less-than-predicate value (b-tree-value tree))
- (let ((new-left
- (if (b-tree-left tree)
- (add-to-b-tree value (b-tree-left tree))
- (make-b-tree :value value :count 1))))
- (setf (b-tree-left result) new-left)
- result)
- (let ((new-right
- (if (b-tree-right tree)
- (add-to-b-tree value (b-tree-right tree))
- (make-b-tree :value value :count 1))))
- (setf (b-tree-right result) new-right)
- result))))
- (make-b-tree :value value :count 1))) ; new, empty tree
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; collect-b-tree-values
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun collect-b-tree-values (tree)
- (if (b-tree-value tree)
- (let ((l (b-tree-left tree))
- (r (b-tree-right tree)))
- (concatenate 'list (if l (collect-b-tree-values l))
- (list (b-tree-value tree))
- (if r (collect-b-tree-values r))))))
-